/*
 * Класс контейнера с комментариями и подгрузчиками.
 */
function CommentsContainer(commentscontrol_object) {
	this.ccontrol = commentscontrol_object;
	this.item_oid = this.ccontrol.item_oid;
	this._view = new CommentsContainerView(this.item_oid);
	this.commentslist_id = "#commentslist"+this.item_oid;
	this.submitter = null // объект субмиттер
	this.comments = {}; // массив объектов - комментариев
	this.loader_ctls = {}; // массив объектов - подгрузчиков комментариев

	/*
	 * Вставить html и создать необходимые экземпляры в зависимости от содержимого
	 *
	 * @param html - сам html код который нужно вставить
	 * @param dom_element - дом элемент после которого вставить
	 * @param count - кол-во комментариев, которое вставляется
	 */
	this.insertHtmlComments = function(html, dom_element, count) {
		// увеличим кол-во комментов
		if (this.ccontrol.getCommentsCount() != null) {
			this.ccontrol.setCommentsCount(this.ccontrol.getCommentsCount()*1 + count*1);
		} else {
			this.ccontrol.setCommentsCount(count*1);
		}

		// вставим html
		if (jQuery(dom_element).size() > 0) {
			this._view.insertCommentAfter(dom_element, html);
		} else {
			// это первый коммент
			this._view.insertComments(html);
		}

		// создадим экземпляры класса Comment для свежепоявившихся комментов
		this.createCommentsInstances();

		// подгрузчики досоздадим
		this.createLoaderControls();

		// обновим контрол контейнера
		this.ccontrol.update();
	}

	/*
	 * До/создает экземпляры класса Comment всех комментов которые найдет в текущем контейнере
	 */
	this.createCommentsInstances = function() {
		var _this = this;

		jQuery(this._view.getComments()).each(function (i) {
			var oid = _this._view.getCommentOidByElt(this);

			if (_this.comments[oid] == null) {
				_this.comments[oid] = new Comment(_this, this);
			}

		});
	}

	/*
	 * Проверить нет ли у нас в доме подгрузчиков, если есть, создать (досоздать) экземпляр CommentsLoaderControl
	 */
	this.createLoaderControls = function() {
		/* тут мы ждем вот что:

		{{:comments_loader}}
		<a id="loader{{id}}" href="#" class="cmore-" style="margin-left: {{!eval (offset * 30)}}px;"><span>Ещё {{l_count}} комментария</span>
		{{?items_offset}}
		<a href="{{items_offset}}" class="loader_type2"></a>
		{{/?}}
			</a>
		{{/:comments_loader}}

		*/
		var _this = this;
		jQuery(this._view.getLoaders()).each(function (i) {
			var id = _this._view.getOidByEltLoader(this);
			if (_this.loader_ctls[id]==null) {
				_this.loader_ctls[id] = new CommentsLoaderСontrol(this, _this);
			}

		});

	}

	/*
	 * Кем используется?
	 */
	var comments_expired = true; // устарело ли содержимое commentslist ?

	/*
	 * Что тут?
	 */
	this.setExpired = function() {
		comments_expired = true;
	}

	this.unsetExpired = function() {
		comments_expired = false;
	}

	// private
	this._lookup_in_progress = false;

	/*
	 * проверит если есть контейнер в DOM, то ничего не делает, если нету - загружает,
	 * также проверит не запущен ли лукап дважды
	 */
	this.lookupContainer = function(event_name) {
		if (this._view.isEmptyContainer()) {
			this._loadContainer(event_name);
		} else {
			this._view.showContainer();
			jQuery(this.ccontrol._view.getSelf()).trigger(event_name);
		}
	}

	this._loadContainer = function(event_name) {
		cp.set_env_object(this);
		cp.call(get__Url('/ajax'), 'ajax_getContainer', function(result) {
			// выведет контейнер

			this._view.insertContainer(result.ajaxResponse['0'].data);
			this._view.hideComments();

			// TODO: переместить эту связь в объекты *View
			jQuery(this.ccontrol._view.getSelf()).trigger(event_name);

		}, this.item_oid);
	}

	/*
	 * Загружает и вставляет в контейнер первую партию комментов
	 *
	 * Эта функция вызывается из контроллера комментариев. Она должна
	 * подгрузить контейнер и встроить в него комментарии. При последующих скрываниях и
	 * открытиях она не должна подгружать.
	 *
	 */
	this.showComments = function() {
		this._view.showComments();

		var is_comments_in_dom = this._view.isCommentsInDom();

		if (!is_comments_in_dom || comments_expired) {

			if (is_comments_in_dom) { // очистим контейнер комментариев
				this._view.rmComments();
			}

			cp.set_env_object(this);
			cp.call(get__Url('/ajax'), 'ajax_getComments', function(result) {
				this._getComments_callback(result);
				}, this.item_oid);
		}
	}

	this._getComments_callback = function(result) {
		this._view.insertComments(result.ajaxResponse['0'].comments['0'].data);

		this.createCommentsInstances();

		this.createLoaderControls();
		this.unsetExpired();
	}

	// скрыть комменты в контейнере
	this.hideComments = function() {
		this._view.hideComments();
		this._view.hideContainer();
	}

	this.hideSubmitForm = function() {
		if (this.submitter != null) {
			this.submitter.remove();
			this.submitter = null;
		}
		this._view.hideContainer();
	}

	// выводит сабмиттер в контейнер
	this.showSubmitForm = function(use_temp_cont) {
		// сабмиттер комментов 1-го уровня для самой записи
		if (this.submitter == null) {
			this.submitter = new CommentSubmit(this); // объект субмиттер
			this.submitter.setCContainer(this);
			this.submitter.setItemOid(this.item_oid);
		}
		this.submitter.show(use_temp_cont);
	}

	/*
	 * Этот и следующий метод это способ связи двух вьюх компонентов комментария
	 */
	this.getSelf = function() {
		return jQuery(this.commentslist_id).parent();
	}

	/*
	 * вернет элемент после которого вставлять новый коммент
	 */
	this.getNewCommentPrevElt = function() {
		return jQuery(this.commentslist_id+">"+"div:last");
	}

	/*
	 * вызывается CommentSubmitter при сабмите
	 */
	this.onAnswerEnd = function() {}
}